package repositorios;

import interfaceRepositorio.IRepositorioTurno;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import entidades.Turno;
import excecoes.FalhaPersistenciaException;

public class RepositorioTurno extends RepositorioAbstrato implements IRepositorioTurno {

	private String cadastraStm = "INSERT INTO TBTURNO (turno,oficial) VALUES (?,?)";

	private String consultaStm = "SELECT * FROM TBTURNO WHERE turno = ?";

	private String consultaIdStm = "SELECT * FROM TBTURNO WHERE id = ?";

	private String consultaAllStm = "SELECT * FROM TBTURNO WHERE oficial = 1";

	private String lastId = "SELECT LAST_INSERT_ID() ID";

	public RepositorioTurno(){

	}

	/**
	 * Cadastrar turno.
	 * 
	 * @param turno
	 * @throws FalhaPersistenciaException
	 * @throws SQLException
	 */
	public void cadastrar(Turno turno) throws FalhaPersistenciaException,
	SQLException {

		Connection conn = encontrarConexao();
		PreparedStatement stm;

		stm = conn.prepareStatement(cadastraStm);

		stm.setString(1, turno.getTurno());
		stm.setBoolean(2, turno.isOficial());
		

		stm.execute();
		turno.setId(ultimoID());
		
		stm.close();
	}

	/**
	 * Consultar.
	 * 
	 * @param turno
	 * @param hora_ID
	 * @return
	 * @throws FalhaPersistenciaException
	 * @throws SQLException
	 */
	public Turno consultarporTurno(String turno)
	throws FalhaPersistenciaException, SQLException {

		Turno retorno = null;

		Connection conn = encontrarConexao();
		PreparedStatement stm;

		stm = conn.prepareStatement(consultaStm);
		stm.setString(1, turno);

		ResultSet result = stm.executeQuery();
		if(result.next()){
			retorno = new Turno();

			retorno.setId(result.getInt("id"));
			retorno.setTurno(result.getString("turno"));
			retorno.setOficial(result.getBoolean("oficial"));
		}

		stm.close();
		if(result!=null){
			result.close();
		}

		return retorno;
	}

	/**
	 * Consultar turno.
	 * 
	 * @param id
	 * @return
	 * @throws FalhaPersistenciaException
	 * @throws SQLException
	 */
	public Turno consultarPorId(int id) throws FalhaPersistenciaException,
	SQLException {

		Turno retorno = null;

		Connection conn = encontrarConexao();
		PreparedStatement stm;

		stm = conn.prepareStatement(consultaIdStm);
		stm.setInt(1, id);

		ResultSet result = stm.executeQuery();
		if(result.next()){
			retorno = new Turno();

			retorno.setId(result.getInt("id"));
			retorno.setTurno(result.getString("turno"));
			retorno.setOficial(result.getBoolean("oficial"));
		}
		stm.close();
		if(result!=null){
			result.close();
		}

		return retorno;
	}

	/**
	 * Consultar todos os turnos.
	 * 
	 * @return
	 * @throws FalhaPersistenciaException
	 * @throws SQLException
	 */
	public Collection<Turno> consultarTodos()
	throws FalhaPersistenciaException, SQLException {

		Collection<Turno> retorno = new ArrayList<Turno>();
		Turno turno = null;

		Connection conn = encontrarConexao();
		PreparedStatement stm;

		stm = conn.prepareStatement(consultaAllStm);
		ResultSet result = stm.executeQuery();
		while (result.next()) {
			turno = new Turno();

			turno.setId(result.getInt("id"));
			turno.setTurno(result.getString("turno"));
			turno.setOficial(result.getBoolean("oficial"));
			retorno.add(turno);
		}
		stm.close();
		if(result!=null){
			result.close();
		}

		return retorno;
	}

	private int ultimoID() throws FalhaPersistenciaException, SQLException {

		int retorno = -1;

		Connection conn = encontrarConexao();
		PreparedStatement stm;

		stm = conn.prepareStatement(lastId);
		
		ResultSet result = stm.executeQuery();
		if(result.next()){
			retorno = result.getInt("id");
		}

		stm.close();
		if(result!=null){
			result.close();
		}

		return retorno;
	}

}
